#include <iostream>
#include "cstring"
using namespace std;

/*
    string常用的方法
    1.规律
      subposS--》表示下标
      sublen--》长度
      迭代器 还木有学 string& append (InputIterator first, InputIterator last);
*/

int main()
{
    string s1 = "hello";
    string s2 = "world";

    // 追加字符串   append
    // s1.append(s2);       // 将str2拼接到str1后面
    // s1.append(s2, 1, 3); // 将str2中从下标1开始的3个字符拼接到str1后面
    // s1.append(15, '@'); // 将15个@拼接到str1后面

    // 赋值 会清空覆盖原始内容   assign
    // s1.assign(s2);       // 将str2赋值给str1
    // s1.assign(s2, 1, 3); // 将str2中从下标1开始的3个字符赋值给str1
    // s1.assign(15, '@');  // 将15个@赋值给str1

    // 获取下标对应的字符   at
    // cout << s1.at(3) << endl;
    // s1.at(3) = '@'; // 修改下标对应的字符

    // 获取末尾字符  back
    // cout << s1.back() << endl; // 获取最后一个字符
    // s1.back() = '@';           // 修改最后一个字符

    // 获取第一个字符  front
    // cout << s1.front() << endl; // 获取第一个字符
    // s1.front() = '@';           // 修改第一个字符

    // 转换为C风格的字符串  c_str
    // const char *p = s1.c_str(); // 转换为C风格的字符串
    // cout << p << endl;

    // 清空字符串  clear
    // s1.clear();

    // 判断字符串是否为空  empty
    // if (s1.empty())
    // {
    //     cout << "s1为空" << endl;
    // }
    // else
    // {
    //     cout << "s1不为空" << endl;
    // }

    // 返回指向字符串的指针 data
    // const char *p = s1.data(); // 返回指向字符串的指针
    // cout << p << endl;

    // 删除字符串中的字符  erase              // 有时需要考虑删除一个字符后，i要回退一步
    // s1.erase(1, 3); // 删除从下标1开始的3个字符
    // s1.erase(1);    // 删除下标1开始的字符

    // 查找字符串中的字符  find -1表示未找到
    // int pos = s1.find('a');       // 查找字符a的下标
    // int pos = s1.find("ll");      // 查找字符串ll的下标
    // int pos = s1.find("l", 3);    // 从下标1开始查找字符ll的下标
    // int pos = s1.find("o", 1, 1); // 从下标1开始查找字符ll的下标，最多查找1个字符      ??????????
    // cout << pos << endl;

    // 插入字符串  insert
    // s1.insert(1, "11111");  // 在下标1的位置插入字符串
    // s1.insert(1, 3, 'a');   // 在下标1的位置插入3个字符a
    // s1.insert(1, "ll", 1);  // 在下标1的位置插入字符串ll中的第一个字符
    // s1.insert(1, s2, 1, 1); // 在下标1的位置插入字符串ll中的第一个字符，最多插入1个字符

    // 获取字符串长度 length
    // int len = s1.length();
    // cout << len << endl;

    // 在字符串末尾添加字符  push_back
    // s1.push_back('a');

    // 删除字符串末尾的字符  pop_back
    // s1.pop_back();

    // 替换字符串中的字符  replace   无论字符串是长还是短，都会被整体替换掉你指定的字符串
    // s1.replace(1, 3, "11111");                           // 从下标1开始替换3个字符为字符串11111
    // s1.replace(1, 3, 3, 'a');                            // 从下标1开始替换3个字符为字符a
    // s1.replace(1, 3, s2, 1, 1);                          // 从下标1开始替换3个字符为字符串s2中的第一个字符，最多替换1个字符
    // s1.replace(s1.length() - 1, 1, s2, s2.length() - 1); // 从下标1开始替换3个字符为字符串s2中的第一个字符，最多替换1个字符

    // 截取字符串  substr
    // string s3 = s1.substr(1, 3); // 从下标1开始截取3个字符
    // cout << s3 << endl;

    // 获取字符串的长度 size  length()和size()成员函数完全没有区别
    // int len = s1.size();
    // cout << len << endl;

    // 交换字符串 swap
    // s1.swap(s2);
    // cout << s1 << endl;
    // cout << s2 << endl;

    // 拷贝字符串size_t copy(char *s, size_t len, size_t pos = 0) const;
    // char buf[20] = {0};
    // s1.copy(buf, 5); // 把str1里面的字符串拷贝到char*虫
    // cout << "buf is:" << buf << endl;
    
    // const char *p = s2.c_str();
    // s1.copy(p, 5); // copy要求是char*但是p是constchar*编译报错
    //                // 有解决方法：后面会学习转换函数const_cast

    cout << s1 << endl;
    return 0;
}
